<?php
/*
*  Класс обеспечивает работу с датами. Преобразование из формата, понятного человеку в формат БД и обратно
*/

/**
 * Класс для работы с датой и временем
 *
 *Чаще всего используются 2 функции:
 * getTimeForUser возвращает дату и время во временном поясе пользователя, нужно передавать время из бд
 * gLocalTime2BD возвращает настоящее время по гринфичу, для записи в бд
 */
class Service_Date {

	/**
	 * Возвращает время по гринфичу, для записи в бд
	 *
	 * @param mixed $localstamp
	 * @return время по гринфичу
	 */
	public static function gLocalTime2BD($localstamp = false) {
		if ($localstamp === false) $localstamp = time();
		return gmdate("Y-m-d H:i:s", $localstamp);
	}

	/**
	 * Возвращает время по гринфичу, для записи в бд
	 *
	 * @param mixed $localstamp
	 * @return время по гринфичу
	 */
	public static function currentDate2BD() {
		$localstamp = time();
		return gmdate("Y-m-d", $localstamp);
	}


  /**
   * Функция возвращает дату и время
   *
   * @param str $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getOnlyTimeForUsergetTimeForUser($date, $timeZone = 3) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date) + 3600 * Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		//$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*(-24+Service_Date::summerTime($timeZone)));

		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));


		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']) {
         switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Cегодня";
          break;
          case 1:
            $convDate = "вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
			$convDate .= " в " .  $convTime;
		}
  	else {
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г . ";
  	}
  	return $convDate;
  }


  /**
   * Функция возвращает время
   */
  public static function getOnlyTimeForUser($time, $timeZone = 3) {
  	echo '<pre>';
  		print_r($time);
  	echo '</pre>';
		//return $convTime = substr($time,11, 5);
  }



  /**
   * Функция возвращает дату и время в нужном падеже, по умолчанию родительном(падеж задается номером 1-именительный 2-родительный 3-дательном 4-винительный 5-творительный 6-предложный)
   *
   * @param str $date
   * @param int $timeZone
   * @param int $case
   * @return дату и время в нужном падеже
   */
  public static function getCaseDateForUser($date, $timeZone = 3, $case = 2) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		//$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*(-24+Service_Date::summerTime($timeZone)));
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));

		switch ($case) {
			case 1:
				$mothName = Service_Date::getMonthNameI($arrDate['mon']);
			break;
			case 2:
				$mothName = Service_Date::getMonthNameR($arrDate['mon']);
			break;
			case 3:
				$mothName = Service_Date::getMonthNameD($arrDate['mon']);
			break;
			case 4:
				$mothName = Service_Date::getMonthNameV($arrDate['mon']);
			break;
			case 5:
				$mothName = Service_Date::getMonthNameT($arrDate['mon']);
			break;
			case 6:
				$mothName = Service_Date::getMonthNameP($arrDate['mon']);
			break;
		}
		if ($arrNow['year'] == $arrDate['year'] ) {
			switch ($arrNow['yday'] - $arrDate['yday']) {
				case 0:
					$convDate = "Сегодня";
					break;
				case 1:
					$convDate = "Вчера";
					break;
				case 2:
					$convDate = "2 дня назад";
					break;
				case 3:
					$convDate = "3 дня назад";
					break;
				default:
					$convDate = $arrDate['mday'] . " " . $mothName;
					break;
			}
		}
		else {
			$convDate = $arrDate['mday'] . " " . $mothName . " " . $arrDate['year'] . " г . ";
		}
		$convDate .= " в " .  $convTime;

		return $convDate;

  }


  /**
   * Функция возвращает абсолютную дату и время в нужном падеже, по умолчанию родительном(падеж задается номером 1-именительный 2-родительный 3-дательном 4-винительный 5-творительный 6-предложный)
   *
   * @param str $date
   * @param int $timeZone
   * @param int $case
   * @return дату и время в нужном падеже
   */
  public static function getCaseAbsDateForUser($date, $timeZone = 3, $case = 2) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date)+3600*Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);
		//$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*(-24+Service_Date::summerTime($timeZone)));
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));
		switch ($case) {
			case 1:
				$mothName = Service_Date::getMonthNameI($arrDate['mon']);
			break;
			case 2:
				$mothName = Service_Date::getMonthNameR($arrDate['mon']);
			break;
			case 3:
				$mothName = Service_Date::getMonthNameD($arrDate['mon']);
			break;
			case 4:
				$mothName = Service_Date::getMonthNameV($arrDate['mon']);
			break;
			case 5:
				$mothName = Service_Date::getMonthNameT($arrDate['mon']);
			break;
			case 6:
				$mothName = Service_Date::getMonthNameP($arrDate['mon']);
			break;
		}
 		$convDate = $arrDate['mday'] . " " . $mothName . " " . $arrDate['year'] . " г . ";
  	$convDate .= " в " . $convTime;

  	return $convDate;
  }


   /**
   * Функция возвращает только дату
   *
   * @param str $date
   * @param int $timeZone
   * @return только дату
   */
  public static function getDateForUser($date, $timeZone = 3) {
  	$convDate="";
  	$date = date('Y-m-d H:i:s', strtotime($date)+3600*(-24+Service_Date::summerTime($timeZone)));
		$arrDate = getdate(strtotime($date));
		//$arrNow = getdate(time()-gmmktime(12)+mktime(12)+3600*Service_Date::summerTime($timeZone));
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']) {
        switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'];
          break;
			}
		}
  	else {
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г . ";
  	}

  	return $convDate;
  }
  /**
   * Метод выводит дату
   *
   * @param str $date
   * @param bool $useWordsOfNearestWords
   */
  public static function getDateForUserWithoutChanges($date, $useWordsOfNearestWords = true) {
  	$convDate="";
  	//$date = date('Y-m-d H:i:s', strtotime($date)+3600*(-24+Service_Date::summerTime($timeZone)));

		//$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));
		$arrNow = getdate(time());
		$arrDate = getdate(strtotime($date));
		if ($useWordsOfNearestWords && ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon'])) {
        switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
		}
  	else {
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
  		if ($arrNow['year'] != $arrDate['year']) $convDate.= " " . $arrDate['year'] . " г . ";
  	}

  	return $convDate;
  }

   /**
   * Функция возвращает только дату
   *
   * @param str $date
   * @param int $timeZone
   * @return только дату
   */
  public static function getStrictDateForUser($date) {
  	$convDate="";
  	$date = date('Y-m-d H:i:s', strtotime($date));
		$arrDate = getdate(strtotime($date));
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time())));
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']) {
        switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "2 дня назад";
          break;
          case 3:
            $convDate = "3 дня назад";
          break;
          default:
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
		}
  	else {
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г . ";
  	}

  	return $convDate;
  }
   /**
   * Функция возвращает только дату
   *
   * @param str $date
   * @param int $timeZone
   * @return только дату
   */
  public static function getStrictDateForUserEnglish($date, $monthIsFirst = false) {
  	$convDate="";
  	$date = date('Y-m-d H:i:s', strtotime($date));
		$arrDate = getdate(strtotime($date));
		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time())));
		if ($arrNow['year'] == $arrDate['year'] and $arrNow['mon'] == $arrDate['mon']) {
        switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Today";
          break;
          case 1:
            $convDate = "Yesterday";
          break;
          case 2:
            $convDate = "Two days ago";
          break;
          case 3:
            $convDate = "Three days ago";
          break;
          default:
            if ($monthIsFirst) $convDate = Service_Date::getMonthNameEnglish($arrDate['mon']) . " " . $arrDate['mday'] . " ";
            else $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameEnglish($arrDate['mon']);
          break;
			}
		}
  	else {
  		if ($monthIsFirst) $convDate = Service_Date::getMonthNameEnglish($arrDate['mon']) . " " . $arrDate['mday'] . ", " . $arrDate['year'];
  		else $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameEnglish($arrDate['mon']) . " " . $arrDate['year'];
  	}

  	return $convDate;
  }
  
  /**
   * Функция возвращает дату и время
   *
   * @param str $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getTimeForUserEng($date, $timeZone = -6) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date) + 3600 * Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);

		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));

		if ($arrNow['year'] == $arrDate['year'] && $arrNow['mon'] == $arrDate['mon']) {
         switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Today";
          break;
          case 1:
            $convDate = "Yesterday";
          break;
          case 2:
            $convDate = "Two days ago";
          break;
          case 3:
            $convDate = "Three days ago";
          break;
          default:
            echo$arrDate['mday'] . '-';$convDate = Service_Date::getMonthNameEnglish($arrDate['mon']) . " " . $arrDate['mday'] . " ";
          break;
			}
			$convDate = $convTime . " " . ($convTime < '12:00' ? 'am' : null) . " " . $convDate;
		}
  	else {
  		//$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г . ";
  		$convDate = $convTime . " " . ($convTime < '12:00' ? 'am' : null) . " " . Service_Date::getMonthNameEnglish($arrDate['mon']) . " " . $arrDate['mday'] . ", " . $arrDate['year'];
  	}
  	return $convDate;
  }
  /**
   * Функция возвращает дату и время
   *
   * @param str $date
   * @param int $timeZone
   * @return дату и время
   */
  public static function getTimeForUserRus($date, $timeZone = -6) {
  	$convDate="";
  	$convTime="";
    $date = date('Y-m-d H:i:s', strtotime($date) + 3600 * Service_Date::summerTime($timeZone));
		$arrDate = getdate(strtotime($date));
		$convTime = substr($date,11, 5);

		$arrNow = getdate(strtotime(gmstrftime("%Y-%m-%d %H:%M:%S", time()))+3600*(Service_Date::summerTime($timeZone)));

		if ($arrNow['year'] == $arrDate['year'] && $arrNow['mon'] == $arrDate['mon']) {
         switch ($arrNow['yday'] - $arrDate['yday']) {
          case 0:
            $convDate = "Сегодня";
          break;
          case 1:
            $convDate = "Вчера";
          break;
          case 2:
            $convDate = "Два дня назад";
          break;
          case 3:
            $convDate = "Три дня назад";
          break;
          default:
            echo $arrDate['mday'] . '-';
            $convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']);
          break;
			}
			$convDate = $convDate . " в " .$convTime;
		}
  	else {
  		//$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . " г . ";
  		$convDate = $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . $arrDate['year'] . "г. в " . $convTime;
  	}
  	return $convDate;
  }

   /**
   * Функция возвращает только дату с названием месяца
   *
   * @param str $date
   * @param int $timeZone
   * @return только дату
   */
  public static function getStrictDateWithMonthName($date, $yearFlag = true) {
  	$convDate="";
  	$date = date('Y-m-d H:i:s', strtotime($date));
		$arrDate = getdate(strtotime($date));
		return $arrDate['mday'] . " " . Service_Date::getMonthNameR($arrDate['mon']) . " " . ($yearFlag ? $arrDate['year'] : '');
  }


  /**
   * Возвращает время временную зону ичитывая летнее и зимнее время
   *
   * @param int $timeZone
   * @return unknown
   */
	public static function summerTime($timeZone) {
    static $newTimeZone;
    if (!isset($newTimeZone)) {
      $arrTime = localtime(time(),true);
      if ($arrTime['tm_isdst'] == 1)
        $newTimeZone = $timeZone + 1;
      else
        $newTimeZone = $timeZone;
    }
    return $newTimeZone;
  }


			//Функция возвращает название месяца в именительном падеже
	 public static function getMonthNameI($monthNumber) {
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
	//Функция возвращает название месяца на английском языке
	 public static function getMonthNameEnglish($monthNumber) {
    switch ($monthNumber) {
    	case 01:case '01': return "January";
    	case 02:case '02': return "February";
    	case 03:case '03': return "March";
    	case 04:case '04': return "April";
    	case 05:case '05': return "May";
    	case 06:case '06': return "June";
    	case 07:case '07': return "July";
    	case 08:case '08': return "August";
    	case 09:case '09': return "September";
    	case 10:case '10': return "October";
    	case 11:case '11': return "November";
    	case 12:case '12': return "December";
    	default:return NULL;
    }
  }

  //Функция возвращает название месяца в радительном падеже
	public static function getMonthNameR($monthNumber) {
    switch ($monthNumber) {
    	case 01:case 1: return "января";
    	case 02:case 2: return "февраля";
    	case 03:case 3: return "марта";
    	case 04:case 4: return "апреля";
    	case 05:case 5: return "мая";
    	case 06:case 6: return "июня";
    	case 07:case 7: return "июля";
    	case 08:case 8: return "августа";
    	case 09:case 9: return "сентября";
    	case 10: return "октября";
    	case 11: return "ноября";
    	case 12: return "декабря";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в дательном падеже
	 public static function getMonthNameD($monthNumber) {
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в венительном падеже
	 public static function getMonthNameV($monthNumber) {
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в творительном падеже
	 public static function getMonthNameT($monthNumber) {
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }
  //Функция возвращает название месяца в предложный падеже
	 public static function getMonthNameP($monthNumber) {
    switch ($monthNumber) {
    	case 01: return "январь";
    	case 02: return "февраль";
    	case 03: return "март";
    	case 04: return "апрель";
    	case 05: return "май";
    	case 06: return "июнь";
    	case 07: return "июль";
    	case 08: return "август";
    	case 09: return "сентябрь";
    	case 10: return "октябрь";
    	case 11: return "ноябрь";
    	case 12: return "декабрь";
    	default:return NULL;
    }
  }

  public static function getHTMLYearsSelect($yearStart = 1941, $yearFinish = 2000, $selected = -1, $id = "", $class = "", $name = "") {
    if (!$selected)
      $selected = -1;
    $retText = '<select ';
    if ($id != "")
      $retText .= 'id="' . $id . '"';
    if ($class != "")
      $retText .= ' class="' . $class . '"';
    if ($name != "")
      $retText .= ' name="' . $name . '"';
    $retText .= '>';
    $retText .= '<option value="-1"';
    if ($selected == -1)
      $retText .= ' selected="selected"';
    $retText .= '>--</option>';
    for ($i= $yearStart ; $i <= $yearFinish; $i++) {
      $retText .= '<option value="' . $i . '"';
      if ($selected == $i)
        $retText .= ' selected="selected"';
      $retText .= '>' . $i . '</option>';
    }
    $retText .= '</select>';
    return $retText;
  }

  /**
   * Преобразует дату, вводимую пользователем в формат Unix TimeStamp
   *
   * @param string $strDate
   * @return mixed - верет false, если дата указана некорректно
   */
  public static function humanDateToUnix($strDate) {
    $firstDot = strpos($strDate, '.');
    if (!$firstDot)//В строке нет точек
      return false;
    $secondDot = strpos($strDate, '.', $firstDot + 1);
    if (!$secondDot)//В строке всего одна точка
      return false;
    $day = intval(substr($strDate, 0, $firstDot));
    if (($day < 1) || ($day > 31))
      return false;
    $month = intval(substr($strDate, $firstDot + 1, $secondDot - $firstDot - 1));
    if (($month < 1) || ($month > 12))
      return false;
    $year = intval(substr($strDate, $secondDot + 1));
    if (($year < 1700) || ($year > 2100))
      return false;
    return
      mktime(0, 0, 0, $month, $day, $year);
  }

  /**
   * Проверка даты на правильность
   *
   * @param string $strDate
   * @return bool
   */
  public static function isDateCorrect($strDate) {
    return preg_match("/^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$/", $strDate);
  }

  /**
   * Проверка времени на правильность
   *
   * @param string $strTime
   * @return bool
   */
  public static function isTimeCorrect($strTime) {
    return preg_match("/^[0-2][0-9]:[0-5][0-9]$/", $strTime);
  }

  /**
   * Проверка даты на правильность
   *
   * @param string $strDate
   * @return bool
   */
  public static function isDBDateCorrect($strDate) {
    return preg_match("/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/", $strDate);
  }
  /**
   * Проверка пользовательской даты на правильность
   *
   * @param string $strDate
   * @return bool
   */
  public static function isHumanDateCorrect($strDate) {
  	return preg_match("/^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$/", $strDate);
  }
  public static function isHumanDateCorrect2($strDate) {
  	return preg_match("/^[0-9]{2}-[0-9]{2}-[0-9]{4}$/", $strDate);
  }

  /**
   * Преобразует дату, вводимую пользователем в формат, понятный БД
   *
   * @param string $strDate
   * @return mixed - верет false, если дата указана некорректно
   */
  public static function gHumanDateToBD($strDate) {
  	$unixDate = self::humanDateToUnix($strDate);
    if (!$unixDate)
      return false;
    else
      return self::gLocalTime2BD($unixDate);
  }

   /**
   * Преобразует дату, вводимую пользователем в формат, понятный БД
   *
   * @param string $strDate
   * @return mixed - верет false, если дата указана некорректно
   */
  public static function HumanDateToBD($strDate) {
  	$strDate = str_replace('/', '.', $strDate);
    $unixDate = strtotime($strDate);
    if (!$unixDate)
      return false;
    else
      return date("Y-m-d",$unixDate);
  }

  /**
   * Преобразует дату из формата БД в пользовательский
   * Из 2009-05-26 в 26.05.2009
   *
   * @param string $strDate
   * @return mixed - вернет false, если дата указана некорректно
   */
  public static function BDDateToHuman($strDate) {
  	$unixDate = strtotime($strDate);
    if (!$unixDate) return false;
    else return date("d.m.Y", $unixDate);
  }

  public static function BDDateToHuman2($strDate) {
  	$unixDate = strtotime($strDate);
    if (!$unixDate) return false;
    else return date("d-m-Y", $unixDate);
  }


  public static function addThreeMonthToDate($strDate) {
  	$arrDate = getdate(strtotime($strDate));
  	if ($arrDate['mon'] >= 10) $arrDate['year']++;
  	$arrDate['mon'] = ($arrDate['mon']+3) % 12;

  	return date('d.m.Y', mktime(0,0,0,$arrDate['mon'],$arrDate['mday'],$arrDate['year']));
  }

  public static function getDuration($seconds, $simplier) {
  	$retText = '';
  	if ($seconds < 60) return '0 минут';
  	$minutes = intval($seconds / 60);
  	if ($minutes < 60) return $minutes . Service_Declension::getMinutesDeclension($minutes);
  	$hours = intval($minutes / 60);
  	$minutes = $minutes - $hours * 60;
  	if ($hours < 24) return $hours . Service_Declension::getHoursDeclension($hours) . $minutes . Service_Declension::getMinutesDeclension($minutes);
  	$days = intval($hours / 24);
  	$hours = $hours - $days * 24;
  	if ($days < 30) {
  	  if ($simplier) return $days . Service_Declension::getDaysDeclension($days) . $hours . Service_Declension::getHoursDeclension($hours);
  	  else return $days . Service_Declension::getDaysDeclension($days) . $hours . Service_Declension::getHoursDeclension($hours) . $minutes . Service_Declension::getMinutesDeclension($minutes);
  	}
  	$months = intval($days / 30);
  	$days = $days - $months * 30;
	  if ($simplier) return $months . Service_Declension::getMonthsDeclension($months) . $days . Service_Declension::getDaysDeclension($days);
	  else return $months . Service_Declension::getMonthsDeclension($months) . $days . Service_Declension::getDaysDeclension($days) . $hours . Service_Declension::getHoursDeclension($hours) . $minutes . Service_Declension::getMinutesDeclension($minutes);
  }

  /**
   * Возвращает число или месяц двумя цифрами
   *
   * @param $number - число
   * @return число двумя цифрами
   */
  public static function twoDigits($number) {
    if (strlen($number)<2) return '0' . $number;
    else return $number;
  }
  /**
   * Возвращает возраст
   *
   * @param string $birthDate
   * @return integer
   */
  public static function getAge($strBirthDate) {
  	$arrBirthDate = getdate(strtotime($strBirthDate));
  	$arrNowDate = getdate();
  	if ($arrBirthDate['year'] >= $arrNowDate['year'])
  	  return 0;
  	if ($arrBirthDate['mon'] < $arrNowDate['mon'] || ( ($arrBirthDate['mon'] == $arrNowDate['mon']) && ($arrBirthDate['mday'] <= $arrNowDate['mday']) ) )
  	  $age =  $arrNowDate['year'] - $arrBirthDate['year'];
  	else
  	  $age = $arrNowDate['year'] - $arrBirthDate['year'] - 1;

  	 $age =  strval($age);
  	 $last = $age{strlen($age)-1};
  	 return $age; // . ' years';
  	 switch ($last) {

  	  case 0: return $age . ' лет'; break;
  	 	case 1: return $age . ' год'; break;
  	 	case 2: return $age . ' года'; break;
  	 	case 3: return $age . ' года'; break;
  	 	case 4: return $age . ' года'; break;
  	 	case 5: return $age . ' лет'; break;
  	 	case 6: return $age . ' лет'; break;
  	 	case 7: return $age . ' лет'; break;
  	 	case 8: return $age . ' лет'; break;
  	 	case 9: return $age . ' лет'; break;
  	 }
  }
	/**
	 * Возвращает день недели по номеру
	 *
	 * @param int $weekDay
	 * @return string
	 */
  public static function getWeekDayName($weekDay) {
		switch ($weekDay) {
			case 0:
				return 'понедельник';
				break;
			case 1:
				return 'вторник';
				break;
			case 2:
				return 'среда';
				break;
			case 3:
				return 'четверг';
				break;
			case 4:
				return 'пятница';
				break;
			case 5:
				return 'суббота';
				break;
			case 6:
				return 'воскресенье';
				break;
			default:
				break;
		}
  }
  /**
   * Возвращает дату ближайшего нужного дня недели
   *
   * @param int $weekDay
   */
  public static function getWeekDayInterval($weekDay) {
		$arrDate = getdate(time());
		$nowWeekDay = $arrDate['wday']-1;
		if ($nowWeekDay < 0) $nowWeekDay = 6;
		$interval = $weekDay - $nowWeekDay;
		if ($interval < 0) $interval += 7;
		$arrDate = getdate(time() + 3600*24*$interval);
		return self::twoDigits($arrDate['mday']).'.'.self::twoDigits($arrDate['mon']).'.' . $arrDate['year'];
  }

  /**
   * Метод определяет количество дней в месяце
   *
   * @param int $year
   * @param int $month
   * @return int
   */
  public static function getDaysOfMonth($year, $month) {
  	$arrDate = getdate(strtotime($year . '-' . $month . '-31'));
  	if ($arrDate['year'] > 1970 && $arrDate['mday'] == 31)
  	  return 31;
		$arrDate = getdate(strtotime($year . '-' . $month . '-30'));
  	if ($arrDate['year'] > 1970 && $arrDate['mday'] == 30)
  	  return 30;
		$arrDate = getdate(strtotime($year . '-' . $month . '-29'));
  	if ($arrDate['year'] > 1970 && $arrDate['mday'] == 29)
  	  return 29;
  	return 28;
  }
  /**
   * Метпределяет номер следующего месяца
   *
   * @param int $year
   */
  public static function getNextMonth($month) {
  	if ($month < 12)
  	  return ($month + 1);
  	else
  	  return 1;
  }

  public static function getStrictDateDotted($strDate) {
  	if (isset($strDate)) {
  		list($year, $month, $day) = split('[-.-]', $strDate);
  		return $day . '.' . $month . '.' . substr($year, 2);
  	}
  	else
  		return false;
  }

  public static function getStrictTime($strTime) {
  		if (isset($strTime))
  			return substr($strTime, 0, 5);
  		else
  			return false;
  }

  /**
   * Метод преобразовывает
   *
   * @param integer $year
   * @param integer $month
   * @param integer $day
   * @return string
   */
  public static function getBDDateByYearMonthDay($year, $month, $day) {
    $year = intval($year);
    $month = intval($month);
    $day = intval($day);
    $retStr = $year . '-';
    if ($month < 10) $retStr .= '0';
    $retStr .= $month . '-';
    if ($day < 10) $retStr .= '0';
    $retStr .= $day;
    return $retStr;
  }
  /*
  public static function getAge($date) {
  	$arrDate = getdate(strtotime($date));
  	$arrNowDate = getdate(time());
  	$years = $arrNowDate['year'] - $arrDate['year'];
  	if ($arrNowDate['month'] < $arrDate['month'])
  	  $years--;
  	elseif ($arrNowDate['month'] == $arrDate['month'] && $arrNowDate['mday'] < $arrDate['mday'])
  		$years--;
  }*/

  /**
   * Метод преобразовывает
   *
   * @param string $date
   * @return bool
   */
  public static function checkFutureDate($date) {
  	$date = str_replace('/', '.', $date);
  	$date = strtotime($date);
  	$dateNow = strtotime(date("Y-m-d"));
    if ($date > $dateNow) return true;
    else return false;
  }

  /**
   * Возвращает время в формате "August, 2010"
   *
   * @param string $strDate - BD date
   */
  public static function getMemberSince($strDate) {
    return date('F, Y', strtotime($strDate));
  }
  
  /**
   * Метод формирует массив для селекта из временных отметок
   *
   * @param float $hoursMin
   * @param float $hoursMax
   * @return array
   */
  public static function makeChooseTimeArray($hoursMin = 0, $hoursMax = 24) {
	  $timeMin = $hoursMin * 2;
	  $timeMax = $hoursMax * 2;
    $arrTimes = array();
	  $k = 0;
    for ($j = $timeMin; $j <= $timeMax; $j++) {
      //$arrTimes[$j] = is_int($j/2) ? $j/2 .':00' : (($j-1)/2 . ':30');
      $arrTimes[$k]['name'] = is_int($j/2) ? $j/2 .':00' : (($j-1)/2 . ':30');
      $arrTimes[$k]['value'] = is_int($j/2) ? $j/2 .':00' : (($j-1)/2 . ':30');
      $k++;
    }
    return $arrTimes;
  }
  
  /**
   * Метод преобразует пользовательскую дату к формату БД, используя split
   *
   * @param string $humanDate
   * @return string
   */
  public static function humanDateToBdBySplit($humanDate) {
    if (strlen($humanDate) != 10) return '0000-00-00';
    list($day, $month, $year) = split('[/.-]', $humanDate);
		return $year . '-' . $month . '-' . $day;
  }
}
?>